package br.com.invest.action;

import br.com.invest.model.Acao;
import br.com.invest.model.Cotacao;
import br.com.invest.model.Grupo;
import br.com.invest.model.Transacao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.model.SelectItem;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.security.Identity;

/**
 *
 * @author Kirmaier
 */
@Name("TransacaoController")
@Scope(ScopeType.SESSION)
public class TransacaoController implements Serializable {

    @DataModel("acoes")
    private List<Transacao> listaAcoesGrupo;
    private List<SelectItem> listaAcoes;
    private Transacao transacao;
    private Grupo grupo;
    @In
    private Session investDB;
    public Integer acaoSelecionada;
    public Double quantidadeCompra;
    public Double valorCompra;
    public final String Transacao = "transacao";
    private Cotacao cotacoes;
    public Double valor;

    @Begin(join = true)
    public String createSetup() {

        transacao = new Transacao();
        Date dataTransacao = new Date();
        transacao.setDataTransacao(dataTransacao);

        valor = 0.0;

        acaoSelecionada = null;

        transacao.setGrupo(buscarGrupo());

        transacao.getGrupo().getSaldo();

        listaAcoesGrupo = new ArrayList<Transacao>(0);

        listaAcoes = new ArrayList<SelectItem>(0);
        listaAcoes.add(new SelectItem(null, "..."));
        List<Acao> la = investDB.createCriteria(Acao.class).addOrder(Order.asc("nome")).list();

        for (Acao a : la) {
            listaAcoes.add(new SelectItem(a.getCodAcao(), a.getNome()));

        }
        
        acoesGrupo();

        return Transacao;
    }

    public Grupo buscarGrupo() {
        Criteria c = investDB.createCriteria(Grupo.class);
        c.add(Restrictions.eq("login", Identity.instance().getUsername()));

        grupo = (Grupo) c.uniqueResult();

        return grupo;
    }

    @End
    public Double atualizarCotacao() {
        if (acaoSelecionada != null) {
            Criteria c = investDB.createCriteria(Cotacao.class).createAlias("acao", "acao").add(Restrictions.eq("acao.codAcao", acaoSelecionada)).addOrder(Order.desc("dataCotacao"));

            Cotacao cot = new Cotacao();
            cot = (Cotacao) c.list().get(0);
            valor = cot.getUltimaCotacao();
        }
        return valor;
    }

    public String comprarAcao() {
        try {

            transacao.setTipo("COMPRA");
            if (valorCompra != null) {
                Double qtdeComprada = valorCompra / atualizarCotacao();
                transacao.setQuantidade(qtdeComprada);
                Double saldoGrupo = grupo.getSaldo();
                grupo.setSaldo(saldoGrupo - qtdeComprada);
            } else if (quantidadeCompra != null) {
                Double valorComprado = quantidadeCompra * atualizarCotacao();
                transacao.setQuantidade(valorComprado);
                Double saldoGrupo = grupo.getSaldo();
                grupo.setSaldo(saldoGrupo - valorComprado);
            }
            Date dataCompra = new Date();

            if (transacao.getDataInicio() == null) {
                transacao.setDataInicio(dataCompra);
            }
            transacao.setDataTransacao(dataCompra);

            Acao a = (Acao) investDB.get(Acao.class, acaoSelecionada);

            transacao.setAcao(a);

            investDB.save(transacao);

        } catch (Exception e) {
            e.printStackTrace();
        }
        acoesGrupo();
        return null;
    }

    public String acoesGrupo() {
        listaAcoesGrupo.clear();

        Grupo g = buscarGrupo();
        List<Transacao> c = investDB.createCriteria(Transacao.class).add(Restrictions.eq("grupo.codGrupo", g.getCodGrupo())).addOrder(Order.asc("codTransacao")).list();

        listaAcoesGrupo.addAll(c);

        return null;
    }

    //<editor-fold defaultstate="collapsed" desc="Getters e Setters">
    public List<Transacao> getListaAcoesGrupo() {
        return listaAcoesGrupo;
    }

    public void setListaAcoesGrupo(List<Transacao> listaAcoesGrupo) {
        this.listaAcoesGrupo = listaAcoesGrupo;
    }

    public Double getQuantidadeCompra() {
        return quantidadeCompra;
    }

    public void setQuantidadeCompra(Double quantidadeCompra) {
        this.quantidadeCompra = quantidadeCompra;
    }

    public Double getValorCompra() {
        return valorCompra;
    }

    public void setValorCompra(Double valorCompra) {
        this.valorCompra = valorCompra;
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }

    public Transacao getTransacao() {
        return transacao;
    }

    public void setTransacao(Transacao transacao) {
        this.transacao = transacao;
    }

    public Integer getAcaoSelecionada() {
        return acaoSelecionada;
    }

    public void setAcaoSelecionada(Integer acaoSelecionada) {
        this.acaoSelecionada = acaoSelecionada;
    }

    public List<SelectItem> getListaAcoes() {
        return listaAcoes;
    }

    public void setListaAcoes(List<SelectItem> listaAcoes) {
        this.listaAcoes = listaAcoes;
    }
    //</editor-fold>
}
